/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Persistencia;

import Clases.Usuario;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * Esta clase es la persistencia a la base de datos para la gestión de TIPOS DE IVA. En esta clase se podrá:
 *    - Añadir un tipo de iva
 *    - Obtener un tipo de iva
 *    - Obtener todos los tipos de iva
 * @author Jesús Fernández
 */
public class PersistenciaUsuario {

    public static int insertarUsuario(Usuario usr) {

        int ret = 0;

        // datos para hacer la inserción del USUARIO
        String usuario = usr.getUsuario();
        String clave = usr.getClave();
        int baja = usr.getBaja();
        boolean existe = false;
        

        //obtengo todos los usuario y compruebo si ya existe el que se desea insertar
        List<Usuario> listausr = obtenerUsuarios();
        for(Usuario u: listausr){
            if(usr.equals(u)){
                existe = true;
                ret=4; // mostrara un mensaje de que existe el nombre de usuario
            }
        }
        
        
        // sentencia SQL para la insercion en BD
        String sql = "insert into usuario (usuario, clave, baja)"
                + " values ('" + usuario + "', MD5('" + clave + "')," + baja + ");";

        // declaracion de variables para la conexion de la BD
        Connection con = null;
        Statement st = null;

        // CONEXION y ejecucion de la sentencia SQL
        try {
            con = Conexion.getConexion();
            if(!existe){
                st = con.createStatement();
                ret = st.executeUpdate(sql);
            }
        } catch (Exception e) {
            System.out.println("Error al insertar un nuevo USUARIO \n\n" + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }

        return ret;
    }

    public static int camioClave(String usuario, String clave) {
        int ret = 0;

        Connection con = null;
        Statement st = null;

        String sql = "update usuario set clave=MD5('" + clave + "') where usuario='" + usuario + "';";

        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            ret = st.executeUpdate(sql);

        } catch (Exception e) {
            System.out.println("Error al cambiar la clave del usuario" + usuario + "\n\n" + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }

        return ret;
    }

    public static Usuario obtenterUsuario(String usuario, String clave) {

        // sentencia SQL
        String sql = "select * from usuario where usuario = '" + usuario + "' and clave=MD5('" + clave + "') and baja=1;";

        // declaracion de variables para la conexion y ejecucion de la SQL en BD
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        // declaracion de variables para el objeto USUARIO
        Usuario usr = null;
        int baja;

        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            if (rs.next()) {

                baja = rs.getInt("baja");
                usr = new Usuario(usuario, clave, baja);

            }

            rs.close();
            st.close();

        } catch (Exception e) {
            System.out.println("Error al obtener el USUARIO \n " + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }
        return usr;
    }

   public static Usuario obtenerUsuario(String usuario) {

        // sentencia SQL
        String sql = "select * from usuario where usuario = '" + usuario + "'";

        // declaracion de variables para la conexion y ejecucion de la SQL en BD
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        // declaracion de variables para el objeto USUARIO
        Usuario usr = null;
        int baja;

        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);
            if (rs.next()) {
                baja = rs.getInt("baja");
                usr = new Usuario(usuario,rs.getString("clave") ,baja);
            }

            rs.close();
            st.close();

        } catch (Exception e) {
            System.out.println("Error al obtener el USUARIO \n " + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }
        return usr;
    }

    public static int bajaUsuario(String us) {

        int insertado = 0;
        Connection con = null;
        Statement st = null;

        String sql = "update usuario set baja = '0' where usuario = '" + us + "'";
        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            insertado = st.executeUpdate(sql);

        } catch (Exception e) {
            System.out.println("Error al dar de  cliente" + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }
        return insertado;
    }

    public static int altaUsuario(String codigo) {

        int insertado = 0;
        Connection con = null;
        Statement st = null;

        String sql = "update usuario set baja = '1' where usuario = '" + codigo + "'";
        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            insertado = st.executeUpdate(sql);

        } catch (Exception e) {
            System.out.println("Usuario dado de alta correctamente" + e.getMessage());
        } finally {
            Conexion.cerrarConexion(con);
        }
        return insertado;
    }

    public static ArrayList<Usuario> obtenerUsuarios() {

        // sentencia SQL
        String sql = "select * from usuario";

        // declaracion de variables para el objeto usuario
        ArrayList<Usuario> listausr = new ArrayList();
        Usuario usr = null;
        String usuario = null;
        String clave = null;
        int baja;

        // declaracion de variables para la conexion de la BD
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            while (rs.next()) {

                usuario = rs.getString("usuario");
                clave = rs.getString("clave");
                baja = rs.getInt("baja");

                usr = new Usuario(usuario, clave, baja);

                listausr.add(usr);
            }

            rs.close();
            st.close();
        } catch (Exception e) {
            System.out.println("Error al obtener todos los USUARIOS \n " + e.getMessage());
        }
        return listausr;
    }    
    
    public static int totalUsuarios(){
        int ret = 0;
        
         // sentencia SQL
        String sql = "select count(*) total from usuario ;";

        // declaracion de variables para la conexion de la BD
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            if (rs.next()) {

                ret = rs.getInt("total");
            }

            rs.close();
            st.close();
        } catch (Exception e) {
            System.out.println("Error al obtener todos los USUARIOS \n " + e.getMessage());
        }                
                
        return ret;
    }
            
    
    public static ArrayList<Usuario> obtenerUsuariosPaginacion(int limit, int offset) {

        // sentencia SQL
        String sql = "select * from usuario order by usuario LIMIT "+ limit + " OFFSET "+ offset +" ;";

        // declaracion de variables para el objeto usuario
        ArrayList<Usuario> listausr = new ArrayList();
        Usuario usr = null;
        String usuario = null;
        String clave = null;
        int baja;

        // declaracion de variables para la conexion de la BD
        Connection con = null;
        Statement st = null;
        ResultSet rs = null;

        try {
            con = Conexion.getConexion();
            st = con.createStatement();
            rs = st.executeQuery(sql);

            while (rs.next()) {

                usuario = rs.getString("usuario");
                clave = rs.getString("clave");
                baja = rs.getInt("baja");

                usr = new Usuario(usuario, clave, baja);

                listausr.add(usr);
            }

            rs.close();
            st.close();
        } catch (Exception e) {
            System.out.println("Error al obtener todos los USUARIOS \n " + e.getMessage());
        }
        return listausr;
    }
}
